<?php

class dbinterface {


    function __construct() {
        /*
          Lee la informacion de settings.ini e inicializa sus
          propios atributos con dicha informacion.
         */
         require("/var/SINAPSIS_CONFIG.php");
         $this->uname = $dbusername;
         $this->passwd = $dbpassword;
         $this->host = $dbhost;
         $this->base = $dbname;

      }

      public function connect() {
        /*
          Se conecta a la base de datos.

          To-do: Asegurarse bien de todos los errores que puedan haber en el
          proceso de conexion con la base de datos y tratar de informarlos
          de forma elegante.
         */
        if (!($this->cnx = mysql_connect($this->host, $this->uname, $this->passwd))) {
          die(mysql_error());
        }
        $dbs = mysql_select_db($this->base, $this->cnx);

        if (!is_resource($this->cnx)) {
          $message = 'Fallo en la conexion de la base de datos,';
          $message .= mysql_error() . "\n";
          die($message);
        }

        return array($this->cnx, $dbs);
      }

  public function crearCursor() {
    /*
      Crea y devuelve un objeto cursor para ejecutar querys.
     */
    return new dbCursor($this->cnx);
  }

  public function disconnect() {
    /*
      Desconecta de la base de datos.
     */
    mysql_close($this->cnx);
  }

 public function validar_operacion($operation, $resource, $user){

        $result=FALSE;
        $cursor = $this->crearCursor();
	$Rol=$_SESSION['roles'];
	//var_dump($Rol);

foreach ($Rol as $array => $iDRol){

			
		$query =  "SELECT re.name as recurso, rr.action as permiso FROM rbac_permission rr, rbac_resource re WHERE rr.id_role=".$iDRol." AND rr.id_resource = re.id";
		//echo("<br>El query de verificacion: para estas cosas ".$resource." ".$operation." <br>");
		$cursor->execute($query);

        //echo ("total de rows:". $cursor->count()."");
        if ($cursor->count()){
            while($entry=$cursor->fetchOneArray()){
                //echo ("array para $user $resource $operation: ");
                //var_dump($entry);
                if (($entry['recurso']==$resource)&&($entry['permiso']==$operation)){
                    $result=TRUE;
		    return $result;
                }
            }


        }else{
            $result=NULL;
	}

}

        $cursor->__destruct();

        return $result;

}
 /*public function validar_operacion($operation, $resource, $user){

        $result=FALSE;
        $cursor = $this->crearCursor();
        $query =  "SELECT u.login_id as usuario , re.name as recurso, rr.action as permiso FROM care_users u, rbac_asignation ur, rbac_role ro, rbac_permission rr, rbac_resource re WHERE u.login_id = ur.id_user AND ur.id_role = ro.id AND ro.id = rr.id_role AND rr.id_resource = re.id";
        //echo("<br>El query de verificacion: para estas cosas ".$user." ".$resource." ".$operation." <br>");
        $cursor->execute($query);
        //echo ("total de rows:". $cursor->count()."");
        if ($cursor->count()){
            while($entry=$cursor->fetchOneArray()){
                //echo ("array para $user $resource $operation: ");
                //var_dump($entry);
                if (($entry['usuario']==$user)&&($entry['recurso']==$resource)&&($entry['permiso']==$operation)){
                    $result=TRUE;
                }
            }
            return $result;

        }
        else
            $result=NULL;
        $cursor->__destruct();
        return $result;

    }*/

    public function tablas($nombre){
        $result=0;
	
	$cursor = $this->crearCursor();
        $query =  "SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 'care2x'";
	$cursor->execute($query);
 	while($resource=$cursor->fetchOneArray()){
		if ($resource['table_name']==$nombre){
	//echo("<br> VALORES BUENO  ".$resource[0]."<br>");
			$result=1;
		}

	//echo("<br> VALORES MALO  ".$resource[0]."<br>");
	}

	$cursor->__destruct();
      
	//echo("<br> RESULTADO ".$result."<br>");
        return $result;
    }




    public function seleccionar($recurso,$campos,$buscador){
        $result=FALSE;
        
        $select=$this->validar_operacion("Select",$recurso,$buscador);
        //var_dump($select);
        
        if ($select){
            $cursor = $this->crearCursor();
            $query =  "SELECT type , location FROM rbac_resource WHERE name='$recurso'";
            $cursor->execute($query);
            $resource=$cursor->fetchOneArray();
            
            if (($resource['type']=="table")){
		
                $busqueda="";
                foreach ($campos as $nomb => $valor)
			
                    if($valor!=NULL){
                        if (is_numeric($valor))
                            $busqueda .="".$nomb."=".$valor." AND ";
                        else
                            $busqueda .="".$nomb." = '".$valor."' AND ";
                    }

                $table=$resource['location'];
                


                $query="SELECT * FROM ".$table." WHERE ".$busqueda." 1";
               
                $cursor->execute($query);
                $result=$cursor->fetchAllInArray();
                $cursor->__destruct();
            }
            else{
                //to do: definir para otros casos
            }
        }
        else{
            $result=False;
        }

        return $result;
    }



    public function seleccionar1($recurso,$campos,$buscador){
        $result=FALSE;

            $cursor = $this->crearCursor();
            $query =  "SELECT type , location FROM rbac_resource WHERE name='$recurso'";
            $cursor->execute($query);
            $resource=$cursor->fetchOneArray();
            
            if (($resource['type']=="table")){

                $busqueda="";
                foreach ($campos as $nomb => $valor)
                    if($valor!=NULL){
                        if (is_numeric($valor))
                            $busqueda .="".$nomb."=".$valor." AND ";
                        else
                            $busqueda .="".$nomb." = '".$valor."' AND ";
                    }

                $table=$resource['location'];
                


                $query="SELECT * FROM ".$table." WHERE ".$busqueda." 1";
                //echo("<br>query de select ".$query."<br>");
                $cursor->execute($query);
                $result=$cursor->fetchAllInArray();
                $cursor->__destruct();
            }
            else{
                //to do: definir para otros casos
            }

        return $result;
    }

    public function insertar($recurso,$campos,$insertador){
       $result=NULL;
        $insert= $this->validar_operacion("Insert",$recurso,$insertador);

        if ($insert){
            $cursor = $this->crearCursor();
            $query =  "SELECT type , location FROM rbac_resource WHERE name= '$recurso' ";
            //var_dump($query);
            $cursor->execute($query);
            $resource=$cursor->fetchOneArray();
            if ($resource['type']=="table"){
                $attrs = "";
                $values ="";
                foreach ($campos as $nomb => $valor)
                  $attrs .="".$nomb.",";
                foreach ($campos as $nomb => $valor)
                  $values .="'".$valor."',";

                
                $table=$resource['location'];
                
                $attrs = substr($attrs, 0, -1);
                $values = substr($values, 0, -1);

                $query = "INSERT INTO " . $table . " (".$attrs.") VALUES (".$values.")";
                //echo ("<br>query del insert ".$query."<br>");
                $result=$cursor->execute($query);
                if ($result!=NULL)
                    $result=TRUE;
                $cursor->__destruct();
            }
            else{
                //to do: definir para otros casos
            }
        }
        else{
            $result=false;
        }
        return $result;
    }

    public function modificar($recurso,$campos,$nuevosCampos,$modificador){
        $result=FALSE;
        //var_dump($campos);
        //echo("<br>");
        //var_dump($nuevosCampos);
        $update=$this->validar_operacion("Update",$recurso,$modificador);

        if ($update){
            $cursor = $this->crearCursor();
            $query =  "SELECT type , location FROM rbac_resource WHERE name='$recurso'";
            $cursor->execute($query);
            $resource=$cursor->fetchOneArray();
            if (($resource['type']=="table")){

                $busqueda="";
                
                foreach ($campos as $nomb => $valor)
                    if($valor!=NULL)

                        if (is_numeric($valor)){
                            
                            $busqueda .="".$nomb."=".$valor." AND ";
                        }
                        else
                            $busqueda .="".$nomb."='".$valor."' AND ";

                $changes = "";
                
                foreach ($nuevosCampos as $nomb => $valor){
                    if($valor!=NULL)
                        if (is_numeric($valor))
                            $changes .= $nomb.'= '.$valor.', ';
                        else
                            $changes .= $nomb.'= "'.$valor.'", ';
                    else
                        {
                            if ($valor==0 && is_numeric($valor)){
                                $changes .= $nomb.'= '.$valor.', ';
                            }
                        }
                }
                $changes = substr($changes, 0, -2);

                $table=$resource['location'];
               
                $query = "UPDATE " . $table . " SET " . $changes . " WHERE ".$busqueda." 1";
                //echo("<br>query del modificar ".$query."<br>");
                $result=$cursor->execute($query);
                if ($result!=NULL)
                    $result=TRUE;
                $cursor->__destruct();
            }
            else{
                //to do: definir para otros casos
            }
        }
        else{
            
            $result=False;
        }
        return $result;

    }

    public function eliminar($recurso,$campos,$eliminador){
        $result=FALSE;
       
        $delete=$this->validar_operacion("Delete",$recurso,$eliminador);
        
        if ($delete){
            $cursor = $this->crearCursor();
            $query =  "SELECT type , location FROM rbac_resource WHERE name='$recurso'";
            $cursor->execute($query);
            $resource=$cursor->fetchOneArray();
            if (($resource['type']=="table")){
                $attrs = "";
                $values = "";
                foreach ($campos as $nomb => $valor)
                  if($valor!=NULL){
                        if (is_numeric($valor))
                            $busqueda .="".$nomb."=".$valor." AND ";
                        else
                            $busqueda .="".$nomb." = '".$valor."' AND ";
                    }

                $table=$resource['location'];
                
                $query = "DELETE FROM " . $table . " WHERE ".$busqueda." 1";
                //echo ("<br> este es el query de eliminar ".$query." <br>");
                $result=$cursor->execute($query);
                if ($result!=NULL)
                    $result=TRUE;
                $cursor->__destruct();
            }
            else{
                //to do: definir para otros casos
            }
        }
        else{
            $result=FALSE;
        }
        return $result;

    }

    
    
    // Agregado por GM
    // Funcion que realiza la creacion de un usuario en la base de datos
    // administrada por el manejador.
    public function crear_admin_manejador($user,$pass){
    	$result = False;
    	$result2 = False;
    	$cursor = $this->crearCursor();
        $query = "CREATE USER ".$user."@'localhost' IDENTIFIED BY '".$pass."'";  
        $result = $cursor->execute($query);
        $query = "GRANT SELECT,INSERT,UPDATE,DELETE ON ".$this->base.".* TO ".$user."@'localhost'";
    	$result2 = $cursor->execute($query);
    	if ($result!=NULL && $result2!=NULL){
    		return True;
    	}else{
    		return False;
    	}
    }
}

class dbCursor {
  protected $handler;
  public $result_set;

  function __construct($h) {
    $this->handler = $h;
  }

  public function execute($query) {
    /*
      Ejecuta un query y guarda el resultado en el atributo
      'result_set'. Si algo falla reporta el error y muere.
     */
    $this->result_set = mysql_query($query, $this->handler);
    if (!$this->result_set) {
      /*$message = 'Invalid query: '.mysql_error()."\n";
      $message .= 'Whole query: '.$query."\n";
      die ($message);*/
      return FALSE;
    }
    return $this->result_set;
  }

  public function fetchOne($class_name = '') {
    /*
      Obtiene la tupla del result_set en donde esta parado
      actualmente el cursor y lo devuelve como un objeto
      del tipo $class_name o stdClass
     */
    if ($class_name == '')
      return mysql_fetch_object($this->result_set);
    else

      return mysql_fetch_object($this->result_set, $class_name);
  }

    public function fetchAllInArray() {
    /*
      fetchAllInArray: Devuelve un arreglo con todas las instancias
      del 'result_set' en forma de arreglos asociativos;
     */
    $arr = array();
    while($inst = $this->fetchOneArray())
      array_push($arr, $inst);
    return $arr;
  }

  public function fetchOneArray() {
    /*
      Obtiene la tupla del result_set en donde esta parado
      actualmente el cursor y la devuelve como un arreglo
      asociativo.
     */
    return mysql_fetch_array($this->result_set);
  }

  public function count() {
     /*
      Obtiene el numero de resultados en 'result_set'
     */
    return mysql_num_rows($this->result_set);
  }

  public function getHandler() {
    /*
      Devuelve el manejador actual del cursor
     */
    return $this->handler;
  }

  public function __destruct() {
    /*
      A la hora de morir, libera todos resultados si los hay
     */
    @mysql_free_result($this->result_set);
  }
}


    

?>
